package leetcode.bit;

public class bitDemo {
    public static void main(String[] args) {
        int num = 4;
        /**
         * 计算机并不直接存储二进制原码，而是存储二进制的补码。正数的补码就是原码，
         * 比如1，原码0000 0001，补码也为0000 0001。
         * 而负数的补码，是“符号位不变，原码取反再加一”
         * （计算机毕竟不是人，需要人为嵌入一套完美的规则。这种存储方式有着严谨的数学证明，感兴趣的同学可以自行上网查找。），
         * 比如-1，原码1000 0001，取反1111 1110，加一后1111 1111，1111 1111就是-1的二进制补码。
         * 负数输出时，将补码逆向译成原码，原码取反加一得补码，补码减一取反得原码。
         */
        System.out.println(~num);
        /**
         * 十进制，数字10
         *
         * 二进制原码即补码 0000 1010 直接存储
         *
         * ~10后原码（补码）变为 1111 0101
         *
         * 由于他的符号位是1，系统认为这是一个负数的补码
         *
         * 负数输出时，先将补码减一得1111 0100，再取反得1000 1011
         *
         * 换算成十进制就是-11了
         */
    }
}
